//引入创建仓库的方法
import { defineStore } from "pinia";
//引入api中的ts类型和请求方法
import { reqCode, reqUserLogin } from "@/api/hospital";
import type { UserState, LoginData, UserInfo, UserLoginResponseData } from '@/api/hospital/type'
//引入封装的本地存储方法
import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from '@/utils/user'

const useUserStore = defineStore('User', {
  state: (): UserState => {
    return {
      visible: false,//用于控制登陆组件的dialog显示和隐藏
      code: '',//存储手机验证码
      userInfo: JSON.parse(GET_TOKEN() as string) || ({} as UserInfo)//用户信息
    }
  },
  actions: {
    //获取验证码(返回一个Promise实例对象)
    async getCode(phone: string) {
      let result: any = await reqCode(phone)
      if (result.code == 200) {
        this.code = result.data
      } else {
        return Promise.reject(new Error(result.message))
      }
    },
    //获取用户信息
    async userLogin(loginData: LoginData) {
      let result: UserLoginResponseData = await reqUserLogin(loginData)
      if (result.code == 200) {
        this.userInfo = result.data
        //本地存储,使其持久化存储用户信息
        SET_TOKEN(JSON.stringify(this.userInfo))
        //返回一个成功的Promise对象
        return 'ok'
      } else {
        return Promise.reject(new Error(result.message))
      }
    },
    logout() {
      //清空仓库的数据
      this.userInfo = { name: '', token: '' }
      //清空本地存储的数据
      REMOVE_TOKEN()
    },
    //查询微信扫码的结果（看本地存储中是否有数据）
    queryState() {
      //开启定时器：每隔一段时间询问本地存储是否有信息
      let timer = setInterval(() => {
        //有数据：已经扫码成功
        if (GET_TOKEN()) {
          //关闭对话框
          this.visible = false
          //获取数据
          this.userInfo = JSON.parse(GET_TOKEN() as string)
          //清除定时器
          clearInterval(timer)
        }
      }, 1000)
    }
  },
  getters: {

  }
})

export default useUserStore